from django.http import JsonResponse
from django.shortcuts import render
from django.db.models import Count
from web import models
from web.views.issues import issues


def statistics(request,project_id):

    return render(request,'web/statistics.html')

def statistics_priority(request,project_id):
    """ 按优先级生成饼状图 """
    # 获取前端传送过来的开始时间和结束时间。如果前端未传输start和end则需要手动指定一个
    start = request.GET.get('start')
    end = request.GET.get('end')
    data_dict = {}
    # 先按照饼状图的数据格式要求构造字典
    for key,text in models.Issues.priority_choices:
        data_dict[key] = {'name':text,'y':0}

    # 查询通过优先级分组后得到的数据的数量
    result = models.Issues.objects.filter(project_id=project_id,
                                          create_datetime__gte=start,create_datetime__lt=end).values('priority').annotate(ct=Count('id'))

    # 把分组得到的数据写入到字典中
    if result:
        for item in result:
            data_dict[item['priority']]['y'] = item['ct']

        return JsonResponse({'status':True,'data':list(data_dict.values())})

    data_dict = {}
    return JsonResponse({'status': False, 'data':data_dict})

def statistics_project_user(request,project_id):
    """ 项目成员每个人被分配的任务数量（问题类型的配比）
        要实现细分需要构造一个字典： 把这个字典传给前端后才能在前端详细的展示对应数据
            info = {
                用户id：｛
                    "name":用户名，
                    "status":{
                        "新建":数量，
                        "处理中":数量，
                        "反馈中":数量，
                        ......
                    }
                ｝
            }
    """
    """ 
    要返回给前端的数据格式为：
        context = {
            'status':True,
            'data':{
                'categories': ['Arsenal', 'Chelsea', 'Liverpool', 'Manchester United'],
                'series': [{
                        name: 'BPL',
                        data: [3, 5, 1, 13]
                    }, {
                        name: 'FA Cup',
                        data: [14, 8, 8, 12]
                    }, {
                        name: 'CL',
                        data: [0, 2, 6, 3]
                    }]
            }
        }
"""

    start = request.GET.get('start')
    end = request.GET.get('end')
# 构造注释中的info字典。把项目的创建者和项目的参与者全部构造进来
    all_user_dict = {   # 构造项目的创建者
        request.tracer.project.creator.id:{
            'name':request.tracer.project.creator.username,
            'status':{item[0]:0 for item in models.Issues.status_choices} # 利用生成式构造数据
        },
        'None':{
            'name':"未指派",
            'status': {item[0]: 0 for item in models.Issues.status_choices}
        }
    }
    user_list = models.ProjectUser.objects.filter(project_id=project_id) # 构造项目的参与者
    for item in user_list:
        all_user_dict[item.user_id] = {
            'name':item.user.username,
            'status': {item[0]: 0 for item in models.Issues.status_choices}
        }
# 去数据库的问题表中：Issuse 获取所有的问题，并把符合条件的问题写入到构造的字典中
    issues_list = models.Issues.objects.filter(project_id=project_id,create_datetime__gte=start,create_datetime__lt=end)
    for item in issues_list:
        if not item.assign:
            all_user_dict['None']['status'][item.status] += 1
        else:
            all_user_dict[item.assign.id]['status'][item.status] += 1
    # 利用列表生成式来生成项目中的创建者和所有的指派者
    categories = [data['name'] for data in all_user_dict.values()]
    # 再构造以新建、处理中等等分组，得到对应人员的数据。例如：｛‘name’:'新建'，‘data’：[10,5,8,6]｝
    data_result_dict = {}
    for key,text in models.Issues.status_choices: # item[0]是status_choices中的id，item[1]是：新建、处理中等数据
        data_result_dict[key] = {'name':text,'data':[]}
        # 循环字典all_user_dict的值，获取item[0]对应的数据，并依次写入到字典data_result_dict的data中
        for row in all_user_dict.values():
            count = row['status'][key]
            data_result_dict[key]['data'].append(count)

    # 构造最终要传送给前端的数据
    context = {
        'status':True,
        'data':{
            'categories':categories,
            'series':list(data_result_dict.values())
        }
    }

    return JsonResponse(context)

















